Table of Contents

Le but de ce notebook est d'effectuer de la classification d'images de chiens sur leur race. Différents traitements sont effectués et plusieurs modèles sont entraînés. Le transfert learning est également présent par l'utilisation de VGG16 et de NASNET.

Importations

Récupération des données brutes

Récupération des données traitées

Traitement des données

Le dataset comprends plus de 20000 images de chiens appartenant à 120 races différentes.

Affichons quelques images de la race "coated_wheaten_terrier"

Nous pouvons remarquer que les images montrent bien chacunes un chien. Cependant nous notons qu'il y a beaucoup d'informations superflues étant donné que les chiens ne sont pas totalement centrés.

Ainsi nous allons utiliser l'autre dataset donné que indique la localisation du chien dans chaque image.

Les images sont bien centrées sur le chien permettant ainsi de mieux entraîner nos modèles.

Effectuons ces traitements sur l'ensemble des images et sauvegardons-les pour les prochaines utilisations.

Regardons la distribution des classes

Chaque race a environ 150 échantillons de races. Le jeu de données est plutôt bien balancé.

Petits modeles

Commençons à générer un dataset pour l'entraînement et l'autre de validation.

Ensuite, construisons un réseau de neurones assez simple

Ce CNN a 5 couches et possède presque 10 millions de paramètres.

Au bout de 10 epochs, le CNN atteint 90% en taux de succès pour l'échantillon d'entraînement. Cependant, ce score n'est que de 13% pour l'échantillon de validation.

Nous sommes dans un cas de surapprentissage donc nous allons ajouter de la régularisation.

Régularisation

Les taux de succès des deux jeux de données sont maintenant sensiblement égaux. Cependant, ils n'atteignent qu'un peu plus de 1%.

Pour améliorer ce score, nous pouvons employer de l'augmentation de données.

Data augmentation

Nous allons employer la data augmentation sur le jeu de données d'entraînement en effectuant plusieurs transformations tels que des zoomages, des rotations, des changements d'intensités lumineuses, etc.

Regardons un exemple à partir de cette image

L'image initiale a été transformée aléatoirement 12 fois ci-dessus. Nous observons bien les différences de luminosité ou les rotations effectuées.

En effectuant des tests au préalable, mettre le learning_rate à 0.001 semble être favorable au modèle.

De plus, comme nous utilisons la fonction d'activation ReLu, il est préférable d'initialiser les paramètres avec l'initialisation de He.

Au bout d'une vingtaine d'epoch, la fonction d'objectif se détériore ainsi nous pouvons arrêtre l'exécition à 25 epoch.

Etant donné qu'aucune technique de régularisation n'est employée, le taux de succès du dataset d'entraînement est meilleur que celui de validation.

Cependant, avec la data augmentation, nous parvenons à obtenir un taux de succès d'environ 26%.

Grands modeles

Entraînons maintenant des modèles plus profonds.

Nous allons nous inspirer du modèle VGG16 avec cependant moins de couches.

Ce modèle a 14 couches, soit presque 3 fois plus que le CNN précédent, avec uniquement 1 million de paramètre en plus.

Le modèle fait au maximum 47% de taux de succès sur les données de validation.

Comme nous observons un effet d'overfitting, malgré la présence de dropout, nous allons tester avec la data augmentation.

Data augmentation

Le modèle arrive maintenant a atteindre 48% de taux de succès.

Transfer Learning

Pour essayer d'améliorer nos résultats, nous allons utiliser le transfer learning. En commençant par le VGG16.

VGG16

Nous notons que le modèle est plus profond que le notre et possède plus de 14 millions de paramètres déjà entraînés.

Nous notons qu'avec 50 epochs, le modèle n'atteint que 43% de taux de succès. Cependant, nous remarquons qu'il converge au départ plus rapidement.

En utilisant le fine tuning, donc entraînant les paramètres du modèle, les résultats obtenus ne sont pas meilleurs.

NASNET

Prenons un autre modèle plus complexe.

Ce modèle est bien plus complexe que les précédents et possède presque 85 millions de paramètres.

Dès le premier epoch, le modèle atteint 93% de réussite avec pour maximum 93.11% au quatrième epoch.

Testons avec de l'augmentation de données.

Après 40 epochs, le meilleur résultat n'est pas meilleur que précédemment étant donné que nous obtenons maximum 91% de taux de succès

Tuning

Nous allons maintenant effectuer une recherche d'hyperparmètres en jouant sur le nombre de neurones par couches, l'intensité de dropout, le coefficent d'apprentissage et le beta_1 utilisé pour l'optimizer Adam.

Nous emploierons un random search pour cela avec 10 itérations. Le temps d'éxecution étant assez lent, nous allons pas effectuer plus de recherches.

Nous pouvons atteindre 93.5% de succès en jouant avec le hyperparamètre.

En observant de plus près les résultats du modèle fournissant ce taux de réussite, nous pouvons noter que le modèle peut potentiellement avoir un meilleur succès. Ainsi, nous allons le reprendre et le ré-entraîner avec les mêmes hyperparamètres.

Nous obtenons au mieux 93.61%.

Sauvegardons le modèle.

Analyses d'erreurs

En fonction du dernier modèle, nous allons regarder les différentes erreurs qu'il a effectué.

Vérifions que le taux de succès soit bien cohérent

Trions dans l'ordre décroissant les races de chiens ayant eu le plus d'erreur de prédiction

Nous voyons que la plupart des mauvaises prédictions font référence aux Husky sibériens qui est une race de chien leur ressemblant fortement.

Parmi les mauvaises prédictions, un dingo a été annoté sûrement dû à la couleur de son pelage.

Regardons maintenant pour la race 'collie'

Les mauvaises prédictions pour cette race semble être juste étant donné qu'elles sont pour la plupart des Border collie.

En explorant les données, beaucoup d'images pour la race collie ont été mal annotées.